<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>闭包</title>
</head>

<body>
  <script>
    // ============================== 闭包 ==============================
    // 1. 闭包 : 内层函数 + 访问外层函数变量
    function outer(){
      let  a = 10
      function f(){
        a++
        console.log(a)
    
      }
      f()
    }
  outer()

    // 2. 闭包的应用： 实现数据的私有

    // 统计函数的调用次数
    // let count = 0
    // function fn() {
    //   count++
    //   console.log(`函数被调用${count}次`)
    // }
    // fn()
    

    // 3. 闭包的写法  统计函数的调用次数
    function outer(){
      let count = 0  //局部变量
      function fn() {
        count++
        console.log(`函数被调用${count}次`)
     }
     return fn
    }
    // 调用函数，就可以得到返回值
    const res = outer()  //res 结果是fn函数
    console.log(res())   //()调用一下   

    // 4. 闭包存在的问题： 可能会造成内存泄漏
    // 因为count变量在fn函数中一直要用，所以局部变量count变量不会自动回收，就会导致内存泄露
    // 解决办法 重新赋值
      res = null
  </script>
</body>

</html>